#include <iostream>
#include <pthread.h>
#include <string>
#include <unistd.h>
#include "Thread.hpp"
#include <memory>

using namespace std;

//这时的cnt是全局变量，所有的线程多可以修改并访问
// int cnt = 100;

//这时的cnt是线程局部存储的了---在每个线程当中都有一个该变量的副本
// __thread int cnt = 100;

// //将tid以16进制的形式打印
// string ChangId(const pthread_t &tid)
// {
// #define NUM 1024
//     char namebuff[NUM];
//     snprintf(namebuff,sizeof namebuff,"0x%x",tid);
//     return namebuff;//string = char*  string 的构造函数进行复制
// }

// //子线程runing
// void* start_routine(void* arg)
// {
//     string name = static_cast<const char*>(arg);
//     // pthread_detach(pthread_self());
//     //pthread_detach()用于线程的分离可以使用pthread_self()自己分离自己
//     //(不建议，因为子线程和主线程谁先运行并不确定，可能子线程在还没有自我分离时，主线程就已经在等待了，这时就会报错)
//     //一般创建和分离都统一在主线程上完成
//     // int i = 5;
//     // while(i)
//     // {
//     //     //pthread_self()的使用，时线程获取自己的tid
//     //     cout<< name <<" ,my tid :"<<ChangId(pthread_self())<<endl;
//     //     sleep(1);
//     //     i--;
//     // }
    
//     while(true)
//     {
//         cout << name << "cnt :" << cnt++ << "  &cnt:" << &cnt << endl; 
//         sleep(1);
//     }
// }


// int main()
// {
//     //创建子线程
//     pthread_t tid;
//     pthread_create(&tid,nullptr,start_routine,(void*)"thread one runging...");
//     //分离子线程
//     pthread_detach(tid);

//     //主线程    
    
//     while (true)
//     {
//         cout << "main runing...cnt :" << cnt << "  &cnt:" << &cnt << endl; 
//         sleep(1);
//     }
    

//     // while(true)
//     // {
//     //     cout<<"main thread runing...,child thread tid : "<<ChangId(tid) << endl;
//     //     sleep(1);
//     // }
    
//     //join和detach一次只能使用一个
//     // int n = pthread_join(tid,nullptr);
//     // if(n != 0)
//     // {
//     //     cout<<"该线程已分离，不能join"<<endl;
//     // }

//     return 0;
// }

//自我封装的Thread的使用

void* thread_run(void*args)
{
    string work_type = static_cast<const char*>(args);
    while(true)
    {
        cout << "我是一个新线程，我正在运行..." << work_type << endl;
        sleep(1);
    }
}

int main()
{
    std::unique_ptr<Thread> thread1(new Thread(thread_run , (void*)"hello thread 1" , 1));
    std::unique_ptr<Thread> thread2(new Thread(thread_run , (void*)"hello thread 2" , 2));
    std::unique_ptr<Thread> thread3(new Thread(thread_run , (void*)"hello thread 3" , 3));
    std::unique_ptr<Thread> thread4(new Thread(thread_run , (void*)"hello thread 4" , 4));

    thread1->join();
    thread2->join();
    thread3->join();
    thread4->join();

    return 0;
}